﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace Controllers
{
    public class AutoController
    {
        public static List<Auto> ObtenerAutosTop5(string date_from, string date_to)
        {
            var list = new List<Auto>();
            var sql = "SELECT top 5 Auto_Patente,sum(Viaje_Importe) [Recaudacion] " +
                        "FROM Superacidos.Viaje " +
                        "JOIN Superacidos.Auto on Auto_Id = Viaje_AutoId " +
                        "WHERE Viaje_fecha between '" + date_from + "' and '" + date_to + "' " +
                        "Group BY Viaje_Importe, Auto_Patente, Viaje_Importe " +
                        "Order BY Recaudacion DESC";

            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerObjetoEstadistico(reader));
                }
            }

            return list;
        }

        public static List<Auto> ObtenerTodos(string where, int pagina, int cantidadRegistros)
        {
            var list = new List<Auto>();

            var sql = "Select TOP " + cantidadRegistros + " a.*, mo.MoAu_Nombre, ma.MaAu_Id, ma.MaAu_Nombre " +
                       " From Superacidos.Auto a " +
                       " Join Superacidos.Modelo_Auto mo on mo.MoAu_Id = a.Auto_ModeloId " +
                       " Join Superacidos.Marca_Auto ma on ma.MaAu_Id = mo.MoAu_MarcaId ";

            if (pagina > 1)
            {
                int limiteAnterior = (pagina - 1) * cantidadRegistros;


                var filtrospaginador = !string.IsNullOrEmpty(where)
                                       ? " Auto_Id NOT IN " + "(Select TOP " + limiteAnterior +
                                         " Auto_Id from Superacidos.Auto WHERE " + where +
                                         " ORDER BY Auto_Id) "
                                       : " Auto_Id NOT IN " + "(Select TOP " + limiteAnterior +
                                         " Auto_Id from Superacidos.Auto ORDER BY Auto_Id) ";

                if (!string.IsNullOrEmpty(where))
                {
                    where += " AND ";
                }
                where += filtrospaginador;
            }


            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }

            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerObjeto(reader));
                }
            }

            return list;
        }


        public static bool ExisteLaPatente(string patente, Auto auto)
        {

            var sql = "Select count(*) as Cantidad From Superacidos.Auto WHERE Auto_Patente = '" + patente + "'";
            if (auto != null)
            {
                sql += " AND Auto_Id <> " + auto.Auto_Id;
            }

            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad > 0;
        }

        public static bool ExisteLaLicencia(string licencia, Auto auto)
        {

            var sql = "Select count(*) as Cantidad From Superacidos.Auto WHERE Auto_Licencia = '" + licencia + "'";
            if (auto != null)
            {
                sql += " AND Auto_Id <> " + auto.Auto_Id;
            }

            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad > 0;
        }

        public static bool ExisteElReloj(int relojId, Auto auto)
        {

            var sql = "Select count(*) as Cantidad From Superacidos.Auto WHERE Auto_RelojId = " + relojId;
            if (auto != null)
            {
                sql += " AND Auto_Id <> " + auto.Auto_Id;
            }

            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad > 0;
        }

        public static int ObtenerCantidad(string where)
        {
            var sql = "Select count(*) as Cantidad " +
                         " From Superacidos.Auto a" +
                         " Join Superacidos.Modelo_Auto mo on mo.MoAu_Id = a.Auto_ModeloId" +
                         " Join Superacidos.Marca_Auto ma on ma.MaAu_Id = mo.MoAu_MarcaId";

            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }
            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad;
        }

       
        public static Auto ObtenerUno(int autoId)
        {
            var reader = ConexionBaseDeDatos.GetData("Select * From Superacidos.Auto Where Auto_Id = " + autoId, CommandType.Text);

            return reader.HasRows ? ObtenerObjeto(reader) : null;
        }

        public static List<MarcaAuto> ObtenerMarcas(int marcaId)
        {
            var list = new List<MarcaAuto>();
            //Default para titulo del cbo
            var marcaDefault = new MarcaAuto();
            marcaDefault.MaAu_Id = 0;
            marcaDefault.MaAu_Nombre = "Seleccionar Marca";
            list.Add(marcaDefault);
            //Cargo todas
            var sql = "Select * From Superacidos.Marca_Auto";
            if (marcaId != 0)
            {
                sql += " WHERE MaAu_Id = " + marcaId;
            }
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerMarcaAuto(reader));
                }
            }

            return list;
        }

        public static List<ModeloAuto> ObtenerModelos(int marcaId)
        {
            var list = new List<ModeloAuto>();
            //Default para titulo del cbo
            var modeloDefault = new ModeloAuto();
            modeloDefault.MoAu_Id = 0;
            modeloDefault.MoAu_Nombre = "Seleccionar Modelo";
            list.Add(modeloDefault);
            //Cargo todos
            var sql = "Select * From Superacidos.Modelo_Auto Where MoAu_MarcaId = " + marcaId;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerModeloAuto(reader));
                }
            }

            return list;
        }

        public static Auto ObtenerObjeto(OleDbDataReader reader)
        {
            var auto = new Auto();
            var modelo = new ModeloAuto();
            var marca = new MarcaAuto();

            //Marca del Modelo del Auto
            if (reader["MaAu_Id"] != DBNull.Value)
                marca.MaAu_Id = (int)reader["MaAu_Id"];
            if (reader["MaAu_Nombre"] != DBNull.Value)
                marca.MaAu_Nombre = (string)reader["MaAu_Nombre"];

            //Modelo del Auto
            if (reader["Auto_ModeloId"] != DBNull.Value)
                modelo.MoAu_Id = (int)reader["Auto_ModeloId"];
            if (reader["MoAu_Nombre"] != DBNull.Value)
                modelo.MoAu_Nombre = (string)reader["MoAu_Nombre"];
            modelo.MoAu_Marca = marca;
            
            //Auto
            if (reader["Auto_Id"] != DBNull.Value)
                auto.Auto_Id = (int)reader["Auto_Id"];
            if (reader["Auto_Patente"] != DBNull.Value)
                auto.Auto_Patente = (string)reader["Auto_Patente"];
            if (reader["Auto_Licencia"] != DBNull.Value)
                auto.Auto_Licencia = (string)reader["Auto_Licencia"];
            if (reader["Auto_Rodado"] != DBNull.Value)
                auto.Auto_Rodado = (string)reader["Auto_Rodado"];
            if (reader["Auto_RelojId"] != DBNull.Value)
                auto.Auto_Reloj = RelojController.ObtenerUno((int)reader["Auto_RelojId"]);
            if (reader["Auto_Habilitado"] != DBNull.Value)
                auto.Auto_Habilitado = (bool)reader["Auto_Habilitado"];
            auto.Auto_Modelo = modelo;
           
            return auto;
        }

        public static Auto ObtenerObjetoEstadistico(OleDbDataReader reader)
        {
            var auto = new Auto();
           
            if (reader["Auto_Patente"] != DBNull.Value)
                auto.Auto_Patente = (string)reader["Auto_Patente"];
            if (reader["Recaudacion"] != DBNull.Value)
                auto.Auto_Recaudacion = (decimal)reader["Recaudacion"];

            return auto;
        }

        public static MarcaAuto ObtenerMarcaAuto (OleDbDataReader reader)
        {
            var marcaAuto = new MarcaAuto();

            if (reader["MaAu_Id"] != DBNull.Value)
                marcaAuto.MaAu_Id= (int)reader["MaAu_Id"];
            if (reader["MaAu_Nombre"] != DBNull.Value)
                marcaAuto.MaAu_Nombre = (string)reader["MaAu_Nombre"];

            return marcaAuto;
        }

        public static ModeloAuto ObtenerModeloAuto(OleDbDataReader reader)
        {
            var modeloAuto = new ModeloAuto();

            if (reader["MoAu_Id"] != DBNull.Value)
                modeloAuto.MoAu_Id = (int)reader["MoAu_Id"];
            if (reader["MoAu_Nombre"] != DBNull.Value)
                modeloAuto.MoAu_Nombre = (string)reader["MoAu_Nombre"];

            return modeloAuto;
        }

        public static void Agregar(Auto auto)
        {
            //Auto_Id, Auto_ModeloId, Auto_Patente, Auto_Licencia, Auto_Rodado, Auto_RelojId, Auto_Habilitado
            var sql = "INSERT INTO SUPERACIDOS.Auto (Auto_ModeloId, Auto_Patente, Auto_Licencia, Auto_Rodado, Auto_RelojId, Auto_Habilitado) " +
                       " VALUES ('{0}','{1}',{2},{3},{4},{5})";

             sql = string.Format(sql, auto.Auto_Modelo.MoAu_Id, auto.Auto_Patente,  auto.Auto_Licencia, 
                             auto.Auto_Rodado, auto.Auto_Reloj.Reloj_Id, auto.Auto_Habilitado ? "1" : "0");


             ConexionBaseDeDatos.Guardar(sql, CommandType.Text);

        }

        public static void Modificar(Auto auto)
        {
            /*Si el modelo no existe lo creo (No va al final, queda comentado por si se vuelve a esta funcionalidad)
            auto.Auto_Modelo.MoRe_Id = ModeloAutoController.agregarSiNoExiste(auto.Auto_Modelo);*/

            //Modifico el auto
            var sql = "UPDATE SUPERACIDOS.Auto set Auto_ModeloId = {0} , Auto_Patente = '{1}', Auto_Licencia = '{2}', " +
                      "Auto_Rodado = '{3}', Auto_RelojId = {4}, Auto_Habilitado = {5}" +
                      "WHERE Auto_Id = {6}";

            sql = string.Format(sql, auto.Auto_Modelo.MoAu_Id, auto.Auto_Patente, auto.Auto_Licencia,
                                     auto.Auto_Rodado, auto.Auto_Reloj.Reloj_Id, auto.Auto_Habilitado ? "1" : "0",
                                     auto.Auto_Id);


            ConexionBaseDeDatos.Guardar(sql, CommandType.Text);

        }

        public static void Eliminar(int autoId)
        {
            var sql = "update SUPERACIDOS.Auto set auto_habilitado = 0 where Auto_Id = " + autoId;
            ConexionBaseDeDatos.Guardar(sql, CommandType.Text);
        }

    }

}

